{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "import pickle\n",
    "import tensorflow as tf\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "from sklearn.metrics import roc_curve, auc\n",
    "from timeit import default_timer as timer\n",
    "# needed to see images\n",
    "from IPython.display import display, Image\n",
    "import pickle\n",
    "from sklearn.preprocessing import LabelBinarizer\n",
    "\n",
    "# needed for plotting\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "import seaborn as sns\n",
    "current_palette = sns.color_palette()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'0.12.0-rc1'"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Requires TensorFlow V.12\n",
    "tf.__version__"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "data = pickle.load(open('193_features.p', 'rb'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "working dataframe's shape: (8730, 194)\n"
     ]
    }
   ],
   "source": [
    "s = list(data['sample'])\n",
    "s = pd.DataFrame(s)\n",
    "data_cols = s.columns\n",
    "s['label'] = data['label']\n",
    "print('working dataframe\\'s shape:', s.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "train shape (6984, 194)\n",
      "test  shape (1746, 194)\n",
      "common factors: 1, 2, 3, 6, 9, 18, 97, 194, 291, 582, 873, 1746\n"
     ]
    }
   ],
   "source": [
    "test_preds = {}\n",
    "train = s[0:6984]\n",
    "test = s[6984:]\n",
    "LB = LabelBinarizer().fit(train['label'])\n",
    "test_labels = LB.transform(test['label'])\n",
    "train_labels = LB.transform(train['label'])\n",
    "\n",
    "# truncate data\n",
    "#data_cols = data_cols[:1000]\n",
    "\n",
    "# print shapes\n",
    "print('train shape {}\\ntest  shape {}\\ncommon factors: 1, 2, 3, 6, 9, 18, 97, 194, 291, 582, 873, 1746'.format(train.shape, test.shape))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "all_train_labels = LB.transform(train['label'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "def accuracy(predictions, labels):\n",
    "    return (100.0 * np.sum(np.argmax(predictions, 1) == np.argmax(labels, 1))\n",
    "            / predictions.shape[0])\n",
    "\n",
    "def weight_variable(shape):\n",
    "    initial = tf.truncated_normal(shape, stddev=0.01)\n",
    "    return tf.Variable(initial)\n",
    "\n",
    "def bias_variable(shape):\n",
    "    initial = tf.constant(0.1, shape=shape)\n",
    "    return tf.Variable(initial)\n",
    "\n",
    "def test_accuracy(session, test_data=test, test_labels=test_labels, during = True):\n",
    "    test_data.reset_index(inplace=True, drop=True)\n",
    "    epoch_pred = session.run(prediction, feed_dict={tf_data : test_data.loc[0:check_size-1,data_cols], keep_prob : 1.0})\n",
    "    for i in range(check_size, test_data.shape[0], check_size):\n",
    "        epoch_pred = np.concatenate([epoch_pred, session.run(prediction, \n",
    "                                    feed_dict={tf_data : test_data.loc[i:i+check_size-1,data_cols], keep_prob : 1.0})], axis=0)\n",
    "    if during:\n",
    "        return accuracy(epoch_pred, test_labels)\n",
    "    else:\n",
    "        return epoch_pred"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "## Run Session"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "num_labels = 10\n",
    "batch_size = 97\n",
    "acc_over_time = {}\n",
    "def Run_Session(num_epochs, name, k_prob=1.0, mute=False, record=False):\n",
    "    global train\n",
    "    \n",
    "    start = timer()\n",
    "    with tf.Session(graph=graph) as session:\n",
    "        if record:\n",
    "            merged = tf.merge_all_summaries()  \n",
    "            writer = tf.train.SummaryWriter(\"/tmp/tensorflowlogs\", session.graph)\n",
    "        #tf.initialize_all_variables().run()\n",
    "        tf.global_variables_initializer().run()\n",
    "\n",
    "        print(\"Initialized\")\n",
    "        accu_tr = []\n",
    "        accu_ts = []\n",
    "        \n",
    "        for epoch in range(num_epochs):\n",
    "            \n",
    "            # get batch\n",
    "            train_batch = train.sample(batch_size)\n",
    "            \n",
    "            t_d = train_batch[data_cols]\n",
    "            t_l = LB.transform(train_batch['label'])\n",
    "            \n",
    "            # make feed dict\n",
    "            feed_dict = { tf_data : t_d, train_labels : t_l, keep_prob : k_prob}\n",
    "            \n",
    "            # run model on batch\n",
    "            _, l, predictions = session.run([optimizer, loss, prediction], feed_dict=feed_dict)\n",
    "            \n",
    "            # mid model accuracy checks \n",
    "            if (epoch % 1000 == 0) and not mute:\n",
    "                print(\"\\tMinibatch loss at epoch {}: {}\".format(epoch, l))\n",
    "                print(\"\\tMinibatch accuracy: {:.1f}\".format(accuracy(predictions, t_l)))\n",
    "            if (epoch % 5000 == 0) and not mute:\n",
    "                print(\"Test accuracy: {:.1f}\".format(test_accuracy(session, during=True)))\n",
    "            if (epoch % 1000 == 0):\n",
    "                accu_ts.append(tuple([epoch, test_accuracy(session,  during=True)]))\n",
    "                accu_tr.append(tuple([epoch, test_accuracy(session, test_data=train, test_labels=all_train_labels,  during=True)]))\n",
    "                \n",
    "                \n",
    "        # record accuracy and predictions\n",
    "        test_preds[name] = test_accuracy(session, during=False)\n",
    "        print(\"Final Test accuracy: {:.1f}\".format(accuracy(test_preds[name], test_labels)))\n",
    "        end = timer()\n",
    "        test_preds[name] = test_preds[name].ravel()\n",
    "        acc_over_time[name] = (accu_tr, accu_ts)\n",
    "        print(\"time taken: {0} minutes {1:.1f} seconds\".format((end - start)//60, (end - start)%60))\n",
    "        #tf.train.export_meta_graph()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## DeepNN"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Basic DeepNN model made\n"
     ]
    }
   ],
   "source": [
    "# constants\n",
    "num_labels = 10\n",
    "\n",
    "batch_size = 97\n",
    "check_size = 582\n",
    "feature_size = 193\n",
    "\n",
    "n_hidden1 = 400\n",
    "n_hidden2 = 500\n",
    "n_hidden3 = 400\n",
    "\n",
    "beta = 0.01\n",
    "\n",
    "graph = tf.Graph()\n",
    "with graph.as_default():\n",
    "    # placeholders\n",
    "    tf_data = tf.placeholder(tf.float32, shape=[None, feature_size])\n",
    "    train_labels = tf.placeholder(tf.float32, shape=[None, num_labels])\n",
    "    #test_data = tf.placeholder(tf.float32, shape=[batch_size, feature_size, 1])\n",
    "    keep_prob = tf.placeholder(tf.float32)\n",
    "    \n",
    "    # weights and biases\n",
    "    layer1_weights = weight_variable([feature_size, n_hidden1])\n",
    "    layer1_biases = bias_variable([n_hidden1])\n",
    "    layer2_weights = weight_variable([n_hidden1, n_hidden2])\n",
    "    layer2_biases = bias_variable([n_hidden2])\n",
    "    layer3_weights = weight_variable([n_hidden2, n_hidden3])\n",
    "    layer3_biases = bias_variable([n_hidden3])\n",
    "    layer4_weights = weight_variable([n_hidden3, num_labels])\n",
    "    layer4_biases = bias_variable([num_labels])\n",
    "\n",
    "    # model\n",
    "    def model(data, proba=1.0):\n",
    "        layer1 = tf.nn.relu(tf.matmul(data, layer1_weights) + layer1_biases)\n",
    "        layer1 = tf.nn.dropout(layer1, proba)\n",
    "        \n",
    "        layer2 = tf.nn.relu(tf.matmul(layer1, layer2_weights) + layer2_biases)\n",
    "        layer2 = tf.nn.dropout(layer2, proba)\n",
    "        \n",
    "        layer3 = tf.nn.relu(tf.matmul(layer2, layer3_weights) + layer3_biases)\n",
    "        layer3 = tf.nn.dropout(layer3, proba)\n",
    "        \n",
    "        return tf.matmul(layer3, layer4_weights) + layer4_biases\n",
    "\n",
    "    # Training computation.\n",
    "    logits = model(tf_data, keep_prob)\n",
    "    loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits, train_labels) +\n",
    "                         beta*tf.nn.l2_loss(layer1_weights) +\n",
    "                         beta*tf.nn.l2_loss(layer1_biases) +\n",
    "                         beta*tf.nn.l2_loss(layer2_weights) +\n",
    "                         beta*tf.nn.l2_loss(layer2_biases) +\n",
    "                         beta*tf.nn.l2_loss(layer3_weights) +\n",
    "                         beta*tf.nn.l2_loss(layer3_biases) +\n",
    "                         beta*tf.nn.l2_loss(layer4_weights) +\n",
    "                         beta*tf.nn.l2_loss(layer4_biases))\n",
    "\n",
    "    # Optimizer.\n",
    "    optimizer = tf.train.AdamOptimizer(1e-4).minimize(loss)\n",
    "\n",
    "    # Predictions for the training, validation, and test data.\n",
    "    # !!!! as this RNN model does not allow calling model more than once we will need to get test predictions\n",
    "    #      by running the test data through the same prediction op as the train data. !!!\n",
    "    # !!! make note to not run optimizer on same function call !!!\n",
    "    prediction = tf.nn.softmax(logits)\n",
    "    ### test_prediction = tf.nn.softmax(model(test_data))  \n",
    "    print('Basic DeepNN model made')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Initialized\n",
      "\tMinibatch loss at epoch 0: 2.5593013763427734\n",
      "\tMinibatch accuracy: 10.3\n",
      "Test accuracy: 15.4\n",
      "\tMinibatch loss at epoch 1000: 1.0006884336471558\n",
      "\tMinibatch accuracy: 71.1\n",
      "\tMinibatch loss at epoch 2000: 0.7601749897003174\n",
      "\tMinibatch accuracy: 83.5\n",
      "\tMinibatch loss at epoch 3000: 0.572405993938446\n",
      "\tMinibatch accuracy: 86.6\n",
      "\tMinibatch loss at epoch 4000: 0.5595899820327759\n",
      "\tMinibatch accuracy: 92.8\n",
      "\tMinibatch loss at epoch 5000: 0.4374285042285919\n",
      "\tMinibatch accuracy: 93.8\n",
      "Test accuracy: 44.4\n",
      "\tMinibatch loss at epoch 6000: 0.35475191473960876\n",
      "\tMinibatch accuracy: 96.9\n",
      "\tMinibatch loss at epoch 7000: 0.3784990906715393\n",
      "\tMinibatch accuracy: 96.9\n",
      "\tMinibatch loss at epoch 8000: 0.35881850123405457\n",
      "\tMinibatch accuracy: 96.9\n",
      "\tMinibatch loss at epoch 9000: 0.393671452999115\n",
      "\tMinibatch accuracy: 94.8\n",
      "\tMinibatch loss at epoch 10000: 0.416215181350708\n",
      "\tMinibatch accuracy: 95.9\n",
      "Test accuracy: 45.6\n",
      "\tMinibatch loss at epoch 11000: 0.34918534755706787\n",
      "\tMinibatch accuracy: 96.9\n",
      "\tMinibatch loss at epoch 12000: 0.3501080274581909\n",
      "\tMinibatch accuracy: 97.9\n",
      "\tMinibatch loss at epoch 13000: 0.3222399055957794\n",
      "\tMinibatch accuracy: 99.0\n",
      "\tMinibatch loss at epoch 14000: 0.3332357406616211\n",
      "\tMinibatch accuracy: 96.9\n",
      "Final Test accuracy: 46.2\n",
      "time taken: 3.0 minutes 49.8 seconds\n"
     ]
    }
   ],
   "source": [
    "train = s[0:1000]\n",
    "Run_Session(15000, 'NN1', .2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Initialized\n",
      "\tMinibatch loss at epoch 0: 2.541362762451172\n",
      "\tMinibatch accuracy: 12.4\n",
      "Test accuracy: 9.7\n",
      "\tMinibatch loss at epoch 1000: 1.2692935466766357\n",
      "\tMinibatch accuracy: 61.9\n",
      "\tMinibatch loss at epoch 2000: 1.1614092588424683\n",
      "\tMinibatch accuracy: 62.9\n",
      "\tMinibatch loss at epoch 3000: 0.8936765193939209\n",
      "\tMinibatch accuracy: 75.3\n",
      "\tMinibatch loss at epoch 4000: 0.6921194791793823\n",
      "\tMinibatch accuracy: 84.5\n",
      "\tMinibatch loss at epoch 5000: 0.6170809268951416\n",
      "\tMinibatch accuracy: 88.7\n",
      "Test accuracy: 48.4\n",
      "\tMinibatch loss at epoch 6000: 0.6725472807884216\n",
      "\tMinibatch accuracy: 85.6\n",
      "\tMinibatch loss at epoch 7000: 0.6079206466674805\n",
      "\tMinibatch accuracy: 89.7\n",
      "\tMinibatch loss at epoch 8000: 0.5695197582244873\n",
      "\tMinibatch accuracy: 93.8\n",
      "\tMinibatch loss at epoch 9000: 0.5066466331481934\n",
      "\tMinibatch accuracy: 91.8\n",
      "\tMinibatch loss at epoch 10000: 0.6297001242637634\n",
      "\tMinibatch accuracy: 89.7\n",
      "Test accuracy: 50.1\n",
      "\tMinibatch loss at epoch 11000: 0.502411961555481\n",
      "\tMinibatch accuracy: 96.9\n",
      "\tMinibatch loss at epoch 12000: 0.5555205345153809\n",
      "\tMinibatch accuracy: 92.8\n",
      "\tMinibatch loss at epoch 13000: 0.5106901526451111\n",
      "\tMinibatch accuracy: 93.8\n",
      "\tMinibatch loss at epoch 14000: 0.5932229161262512\n",
      "\tMinibatch accuracy: 89.7\n",
      "Final Test accuracy: 50.2\n",
      "time taken: 3.0 minutes 38.0 seconds\n"
     ]
    }
   ],
   "source": [
    "train = s[0:2000]\n",
    "all_train_labels = LB.transform(train['label'])\n",
    "Run_Session(15000, 'NN2', .2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Initialized\n",
      "\tMinibatch loss at epoch 0: 2.555690050125122\n",
      "\tMinibatch accuracy: 13.4\n",
      "Test accuracy: 11.7\n",
      "\tMinibatch loss at epoch 1000: 1.5344635248184204\n",
      "\tMinibatch accuracy: 49.5\n",
      "\tMinibatch loss at epoch 2000: 1.1869713068008423\n",
      "\tMinibatch accuracy: 66.0\n",
      "\tMinibatch loss at epoch 3000: 0.9844298958778381\n",
      "\tMinibatch accuracy: 70.1\n",
      "\tMinibatch loss at epoch 4000: 0.8521890044212341\n",
      "\tMinibatch accuracy: 80.4\n",
      "\tMinibatch loss at epoch 5000: 0.8478661179542542\n",
      "\tMinibatch accuracy: 79.4\n",
      "Test accuracy: 48.3\n",
      "\tMinibatch loss at epoch 6000: 0.8055051565170288\n",
      "\tMinibatch accuracy: 81.4\n",
      "\tMinibatch loss at epoch 7000: 0.7777283787727356\n",
      "\tMinibatch accuracy: 84.5\n",
      "\tMinibatch loss at epoch 8000: 0.8716806769371033\n",
      "\tMinibatch accuracy: 81.4\n",
      "\tMinibatch loss at epoch 9000: 0.6980472803115845\n",
      "\tMinibatch accuracy: 86.6\n",
      "\tMinibatch loss at epoch 10000: 0.659508228302002\n",
      "\tMinibatch accuracy: 87.6\n",
      "Test accuracy: 50.7\n",
      "\tMinibatch loss at epoch 11000: 0.5777111649513245\n",
      "\tMinibatch accuracy: 89.7\n",
      "\tMinibatch loss at epoch 12000: 0.6122644543647766\n",
      "\tMinibatch accuracy: 87.6\n",
      "\tMinibatch loss at epoch 13000: 0.6019299030303955\n",
      "\tMinibatch accuracy: 89.7\n",
      "\tMinibatch loss at epoch 14000: 0.6319413185119629\n",
      "\tMinibatch accuracy: 90.7\n",
      "Final Test accuracy: 50.9\n",
      "time taken: 3.0 minutes 45.2 seconds\n"
     ]
    }
   ],
   "source": [
    "train = s[0:3000]\n",
    "all_train_labels = LB.transform(train['label'])\n",
    "Run_Session(15000, 'NN3', .2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Initialized\n",
      "\tMinibatch loss at epoch 0: 2.5357611179351807\n",
      "\tMinibatch accuracy: 15.5\n",
      "Test accuracy: 11.4\n",
      "\tMinibatch loss at epoch 1000: 1.4957135915756226\n",
      "\tMinibatch accuracy: 50.5\n",
      "\tMinibatch loss at epoch 2000: 1.2967299222946167\n",
      "\tMinibatch accuracy: 60.8\n",
      "\tMinibatch loss at epoch 3000: 1.2487434148788452\n",
      "\tMinibatch accuracy: 62.9\n",
      "\tMinibatch loss at epoch 4000: 0.9995276927947998\n",
      "\tMinibatch accuracy: 73.2\n",
      "\tMinibatch loss at epoch 5000: 0.819800853729248\n",
      "\tMinibatch accuracy: 79.4\n",
      "Test accuracy: 54.0\n",
      "\tMinibatch loss at epoch 6000: 0.7023181915283203\n",
      "\tMinibatch accuracy: 82.5\n",
      "\tMinibatch loss at epoch 7000: 0.9081413745880127\n",
      "\tMinibatch accuracy: 81.4\n",
      "\tMinibatch loss at epoch 8000: 0.8732615113258362\n",
      "\tMinibatch accuracy: 82.5\n",
      "\tMinibatch loss at epoch 9000: 0.7105173468589783\n",
      "\tMinibatch accuracy: 88.7\n",
      "\tMinibatch loss at epoch 10000: 0.7534568905830383\n",
      "\tMinibatch accuracy: 81.4\n",
      "Test accuracy: 55.6\n",
      "\tMinibatch loss at epoch 11000: 0.619098961353302\n",
      "\tMinibatch accuracy: 94.8\n",
      "\tMinibatch loss at epoch 12000: 0.7963396906852722\n",
      "\tMinibatch accuracy: 82.5\n",
      "\tMinibatch loss at epoch 13000: 0.6453417539596558\n",
      "\tMinibatch accuracy: 87.6\n",
      "\tMinibatch loss at epoch 14000: 0.9214218854904175\n",
      "\tMinibatch accuracy: 77.3\n",
      "Final Test accuracy: 56.6\n",
      "time taken: 4.0 minutes 33.8 seconds\n"
     ]
    }
   ],
   "source": [
    "train = s[0:4000]\n",
    "all_train_labels = LB.transform(train['label'])\n",
    "Run_Session(15000, 'NN4', .2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Initialized\n",
      "\tMinibatch loss at epoch 0: 2.5689339637756348\n",
      "\tMinibatch accuracy: 6.2\n",
      "Test accuracy: 12.7\n",
      "\tMinibatch loss at epoch 1000: 1.7042930126190186\n",
      "\tMinibatch accuracy: 44.3\n",
      "\tMinibatch loss at epoch 2000: 1.5084518194198608\n",
      "\tMinibatch accuracy: 51.5\n",
      "\tMinibatch loss at epoch 3000: 1.1486334800720215\n",
      "\tMinibatch accuracy: 66.0\n",
      "\tMinibatch loss at epoch 4000: 1.3284399509429932\n",
      "\tMinibatch accuracy: 67.0\n",
      "\tMinibatch loss at epoch 5000: 1.0170173645019531\n",
      "\tMinibatch accuracy: 76.3\n",
      "Test accuracy: 56.8\n",
      "\tMinibatch loss at epoch 6000: 0.9745178818702698\n",
      "\tMinibatch accuracy: 76.3\n",
      "\tMinibatch loss at epoch 7000: 0.8288687467575073\n",
      "\tMinibatch accuracy: 89.7\n",
      "\tMinibatch loss at epoch 8000: 0.8551123142242432\n",
      "\tMinibatch accuracy: 80.4\n",
      "\tMinibatch loss at epoch 9000: 0.923401415348053\n",
      "\tMinibatch accuracy: 83.5\n",
      "\tMinibatch loss at epoch 10000: 0.9091646671295166\n",
      "\tMinibatch accuracy: 80.4\n",
      "Test accuracy: 59.0\n",
      "\tMinibatch loss at epoch 11000: 0.8447104096412659\n",
      "\tMinibatch accuracy: 83.5\n",
      "\tMinibatch loss at epoch 12000: 0.8462017178535461\n",
      "\tMinibatch accuracy: 86.6\n",
      "\tMinibatch loss at epoch 13000: 0.7386643886566162\n",
      "\tMinibatch accuracy: 87.6\n",
      "\tMinibatch loss at epoch 14000: 0.9297734498977661\n",
      "\tMinibatch accuracy: 86.6\n",
      "Final Test accuracy: 59.8\n",
      "time taken: 6.0 minutes 39.8 seconds\n"
     ]
    }
   ],
   "source": [
    "train = s[0:5000]\n",
    "all_train_labels = LB.transform(train['label'])\n",
    "Run_Session(15000, 'NN5', .2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Initialized\n",
      "\tMinibatch loss at epoch 0: 2.5856266021728516\n",
      "\tMinibatch accuracy: 10.3\n",
      "Test accuracy: 15.6\n",
      "\tMinibatch loss at epoch 1000: 1.5560860633850098\n",
      "\tMinibatch accuracy: 40.2\n",
      "\tMinibatch loss at epoch 2000: 1.3447009325027466\n",
      "\tMinibatch accuracy: 59.8\n",
      "\tMinibatch loss at epoch 3000: 1.3998777866363525\n",
      "\tMinibatch accuracy: 58.8\n",
      "\tMinibatch loss at epoch 4000: 1.273011326789856\n",
      "\tMinibatch accuracy: 63.9\n",
      "\tMinibatch loss at epoch 5000: 1.171311378479004\n",
      "\tMinibatch accuracy: 68.0\n",
      "Test accuracy: 55.7\n",
      "\tMinibatch loss at epoch 6000: 0.8964895606040955\n",
      "\tMinibatch accuracy: 81.4\n",
      "\tMinibatch loss at epoch 7000: 1.1722732782363892\n",
      "\tMinibatch accuracy: 70.1\n",
      "\tMinibatch loss at epoch 8000: 0.9748114347457886\n",
      "\tMinibatch accuracy: 74.2\n",
      "\tMinibatch loss at epoch 9000: 0.8501774072647095\n",
      "\tMinibatch accuracy: 81.4\n",
      "\tMinibatch loss at epoch 10000: 1.0822762250900269\n",
      "\tMinibatch accuracy: 72.2\n",
      "Test accuracy: 58.0\n",
      "\tMinibatch loss at epoch 11000: 0.8205232620239258\n",
      "\tMinibatch accuracy: 78.4\n",
      "\tMinibatch loss at epoch 12000: 1.0293394327163696\n",
      "\tMinibatch accuracy: 74.2\n",
      "\tMinibatch loss at epoch 13000: 0.8913111686706543\n",
      "\tMinibatch accuracy: 84.5\n",
      "\tMinibatch loss at epoch 14000: 1.1191402673721313\n",
      "\tMinibatch accuracy: 75.3\n",
      "Final Test accuracy: 58.8\n",
      "time taken: 6.0 minutes 25.6 seconds\n"
     ]
    }
   ],
   "source": [
    "train = s[0:6000]\n",
    "all_train_labels = LB.transform(train['label'])\n",
    "Run_Session(15000, 'NN6', .2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Initialized\n",
      "\tMinibatch loss at epoch 0: 2.5555975437164307\n",
      "\tMinibatch accuracy: 12.4\n",
      "Test accuracy: 11.1\n",
      "\tMinibatch loss at epoch 1000: 1.5845431089401245\n",
      "\tMinibatch accuracy: 49.5\n",
      "\tMinibatch loss at epoch 2000: 1.2751085758209229\n",
      "\tMinibatch accuracy: 58.8\n",
      "\tMinibatch loss at epoch 3000: 1.2701315879821777\n",
      "\tMinibatch accuracy: 63.9\n",
      "\tMinibatch loss at epoch 4000: 1.1201924085617065\n",
      "\tMinibatch accuracy: 67.0\n",
      "\tMinibatch loss at epoch 5000: 1.0576838254928589\n",
      "\tMinibatch accuracy: 75.3\n",
      "Test accuracy: 57.2\n",
      "\tMinibatch loss at epoch 6000: 1.198064923286438\n",
      "\tMinibatch accuracy: 69.1\n",
      "\tMinibatch loss at epoch 7000: 1.0338197946548462\n",
      "\tMinibatch accuracy: 72.2\n",
      "\tMinibatch loss at epoch 8000: 0.980186939239502\n",
      "\tMinibatch accuracy: 81.4\n",
      "\tMinibatch loss at epoch 9000: 0.994850218296051\n",
      "\tMinibatch accuracy: 76.3\n",
      "\tMinibatch loss at epoch 10000: 1.0451939105987549\n",
      "\tMinibatch accuracy: 74.2\n",
      "Test accuracy: 60.5\n",
      "\tMinibatch loss at epoch 11000: 1.017863154411316\n",
      "\tMinibatch accuracy: 74.2\n",
      "\tMinibatch loss at epoch 12000: 0.9628950357437134\n",
      "\tMinibatch accuracy: 78.4\n",
      "\tMinibatch loss at epoch 13000: 0.9827948212623596\n",
      "\tMinibatch accuracy: 78.4\n",
      "\tMinibatch loss at epoch 14000: 1.050777554512024\n",
      "\tMinibatch accuracy: 76.3\n",
      "Final Test accuracy: 60.9\n",
      "time taken: 6.0 minutes 25.8 seconds\n"
     ]
    }
   ],
   "source": [
    "train = s[0:6984]\n",
    "all_train_labels = LB.transform(train['label'])\n",
    "Run_Session(15000, 'NN6984', .2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "plt.plot(np.array(acc_over_time[''])[:,0], np.array(acc_over_time['RNN'])[:,1])\n",
    "plt.plot(np.array(acc_over_time['D'])[:,0], np.array(acc_over_time['DeepNN'])[:,1])\n",
    "plt.plot(np.array(acc_over_time['CNN'])[:,0], np.array(acc_over_time['CNN'])[:,1])\n",
    "plt.title('Accuracy')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 99.8       ,  45.64719359])"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.array(acc_over_time['NN1'])[:,14,1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "t_curve = []\n",
    "names = ['NN1', 'NN2', 'NN3', 'NN4', 'NN5', 'NN6', 'NN6984']\n",
    "for name in names:\n",
    "    t_curve.append(list(np.array(acc_over_time[name])[:,14,1]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {
    "collapsed": false,
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nAAAHAREAAAAAIImACAAAAABwEBABAAAAAJIIiAAAAAAABwERAAAAACCJgAgAAAAAcBAQAQAAAACS\nCIgAAAAAAAcBEQAAAAAgiYAIAAAAAHAQEAEAAAAAkgiIAAAAAAAHAREAAAAAIImACAAAAABwEBAB\nAAAAAJIIiAAAAAAABwERAAAAACCJgAgAAAAAcBAQAQAAAACSCIgAAAAAAAcBEQAAAAAgiYAIAAAA\nAHAQEAEAAAAAkgiIAAAAAAAHAREAAAAAIImACAAAAABwEBABAAAAAJIIiAAAAAAABwERAAAAACCJ\ngAgAAAAAcBAQAQAAAACSCIgAAAAAAAcBEQAAAAAgiYAIAAAAAHAM64D4wQcf6Bvf+IZOPPFEnXba\naVq+fLmi0agkaffu3Zo/f76mTp2qmTNnauPGjUPcWgAAAAAY2YZtQIzFYvr6178uv9+v1atXa8WK\nFXrllVd01113SZKuueYa1dbWau3atZozZ44WLVqkXbt2DXGrAQAAAGDkMoe6Ab1599139cEHH2jd\nunXy+/068sgjdf311+v222/XjBkztGPHDj399NMKBAKaOHGiNm3apLVr1+r6668f6qYDAAAAwIg0\nbCuIRx55pB588EH5/f70OcMw1NbWpq1bt2rSpEkKBALpa9OmTdOWLVuGoqkAAAAAcFAYtgGxtrZW\nJ598cvrYtm09+eSTOvnkk9XQ0KAxY8Zk3T9q1Cjt2bNnsJsJAAAAAAeNYRsQcy1dulT/+7//q29+\n85sKhULyer1Z171eb3oBGwAAAABA342IgPjDH/5Qv/jFL3TnnXdq4sSJ8vl83cJgNBrNGnIKAAAA\nAOibYbtIjZQcVvqd73xHGzZs0E9+8hN97nOfkyQdcsgheu+997Lu3bdvn+rq6g74zpqaoEzT3ee2\n1NVV9PkZHBzo+9JF35cu+r400e+li74vXfR9d8M6IC5btkz19fW65557NGPGjPT5yZMn64EHHlA4\nHE4vYrN582ZNmTLlgO9saursczvq6irU0NDW5+cw8tH3pYu+L130fWmi30sXfV+6Srnv9xeMh+0Q\n0y1btujxxx/XwoULdeyxx2rfvn3prxNPPFHjx4/XkiVLtH37dj344IPaunWr5s2bN9TNBgAAAIAR\na9hWEF966SUZhqE777xTd955p6TkkFPDMPTHP/5R9957r7773e9q7ty5Ouyww7Ry5UqNGzduiFsN\nAAAAACOXYdu2PdSNGEz9KSOXcvm51NH3pYu+L130fWmi30sXfV+6SrnvR+QQUwAAAADA4CIgAgAA\nAAAkERABAAAAAA4CIgAAAABAEgERAAAAAOAYtttcAAAAABh+li69RS+8sOGA95177ix95zvfH/Dn\nLVz4de3Zs0dr1jzXp+eWLr1FL75Yr40b/2vAbeirt956Q//2b7/Q//zPH9XZ2ana2lGaNu0EXX75\nP+oTn5jQ7/fu3r1L48aNL2BLuyMgAgAAAMjbnDlzdfzx09PH7777jn71q2d1/vlf0N///dT0+fHj\nP1GQz7viiq8qHA4NuJ2DZf36X+pf/uVHmjx5qr785StVUVGuDz/8UBs2/FKvvfay7r77fk2adGyf\n37t48QKNHl1XkNC9PwREAAAAAHk79ti/07HH/l36OJGI61e/elbHHvsZnXXWOQX/vOOPP7Ffz+W2\nczBEImGtXHm3/t//O01Ll/4469qcORfqyisv0U9+skIPPPBon9/91ltv6txzZxWqqb1iDiIAAAAA\nFMD777+v9va2HkPt2LHjdMopp2r79m2KxWJD0Lr8UEEEAAAAUDQXX3y+jj9+umzb0ssvv6iqqmr9\n/OerVFlZpV/+cq3q69drx47/Uzwe19ixY3XeebP15S9fkX5+wYKr9dFHH6XnIC5c+HV5vT7Nm3eJ\nHnroPv31r39RdXW1Zs2ao/nzr04/96Mf/UAvvliv119/K338pz/9Qd/73q26556f6L33/keBQFCn\nn36mrr12kbxeb/rZnTt3aOXKn2rLlndkmm6dccY5Ouqoifrxj5dqzZr1OvTQQ3v8XYPBoCTplVde\n0jnnnKdgsCzr+ne/+wPdfPNtWeei0ah+/vOH9fLLL2nfvr2qqxujs88+T1dc8VWZpqk9e/6miy8+\nX4Zh6IUXNujFF+t19933a8qU4wbQK70jIAIAAAAoqldeeUlHHHGkrr/+RjU2fqzKyio9+OBKPfHE\nozrvvNmaM+cL6uzs1Isv1uv+++9RWVmZLrjgIkmSYRjd3vfXv27X97//bZ1//hc0Z86FevnlF/Xo\now+ptrY267nMZw3DUFNTkxYvXqjTTz9DF110oV555TU988xq+Xw+XXPNQknSRx/t0bXXflWG4dKX\nv/wVuVwurVu3Ri+//EKPbcl02GGH6zOfmaz//u+tmjt3tk499TSdeOJJOu6441VTUyu32511v2VZ\n+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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x24d725d5358>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure(figsize=[15,7])\n",
    "ticks = ['1k', '2k', '3k', '4k', '5k', '6k', '6984']\n",
    "plt.plot(np.array(t_curve)[:,0], label='Training Set', linewidth=3)\n",
    "plt.plot(np.array(t_curve)[:,1], label='Test Set', linewidth=3)\n",
    "plt.xlabel('Training Size (incrementing by thousand samples)', fontsize=18)\n",
    "plt.xticks(range(7), ticks, fontsize=14)\n",
    "plt.yticks(fontsize=14)\n",
    "plt.ylabel('Accuracy (%)', fontsize=18)\n",
    "plt.ylim([0, 110])\n",
    "plt.xlim([-0.1, 6.5])\n",
    "plt.legend(loc=\"lower right\", fontsize=18)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python [Root]",
   "language": "python",
   "name": "Python [Root]"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
